package com.oracle.springAop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

/**
 * 2.切面类： 可以有5个
 *
 *
 */
public class Aspect {

    //1.前置通知
    public void before(JoinPoint joinPoint){
        //通过连接点 可以获取 基本信息
        Signature signature = joinPoint.getSignature();

        String name = signature.getName();
        System.out.println("链接点的方法名： " + name);
        //
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }

        System.out.println("开启事务");
    }

    //2.后置通知 afterReturning 必须有
    public void afterReturning(Object obj){
        System.out.println(obj); //返回的是方法参数值
        System.out.println("关闭事务");
    }

    //3.环绕通知  around         1.元生jdk，2.spring 半自动， 3。spring全自动
                                 //   4.spring Aop  Aspectj  ，5.注解
    public Object around(ProceedingJoinPoint joinPoint){

        Object obj = null;
        try {

            System.out.println("开启事务");

            obj = joinPoint.proceed();//  跟 invoke(Object ，args);  用于执行目标方法

            System.out.println("关闭事务");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }

    //4. 异常通知  只有出现异常的时候 才会执行
    public void afterThrowing(Throwable throwable){
        System.out.println("异常通知");
    }

    //5. 最终通知  after
    public  void  after(){
        System.out.println("最终通知");
    }










}
